热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

首部|接口类型_OSI7层模型&TCP/IP协议首部封装格式解析

篇首语:本文由编程笔记#小编为大家整理,主要介绍了OSI 7层模型 & TCP/IP协议首部封装格式解析相关的知识,希望对你有一定的参考价值。 概述 物理层:主要定义物理设备标准&#

篇首语:本文由编程笔记#小编为大家整理,主要介绍了OSI 7层模型 & TCP/IP协议首部封装格式解析相关的知识,希望对你有一定的参考价值。



概述


  1. 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。

  2. 数据链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信中使用到的115200、8、N、1(端到端)

  3. 网络层:为在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。(主机(ip)到主机(ip))

  4. 传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做。( 端口(ip+port)到端口(ip+port))

  5. 会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。

  6. 表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。

  7. 应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。


TCP数据包的封装格式


不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。


以太网帧首部


/* default snap length (maximum bytes per packet to capture) */
#define SNAP_LEN 1518
/* ethernet headers are always exactly 14 bytes [1] */
#define SIZE_ETHERNET 14
/* Ethernet addresses are 6 bytes */
#define ETHER_ADDR_LEN 6
/* Ethernet header */
struct sniff_ethernet
u_char ether_dhost[ETHER_ADDR_LEN]; /* destination host address */
u_char ether_shost[ETHER_ADDR_LEN]; /* source host address */
u_short ether_type; /* IP? ARP? RARP? etc */
;

IP首部



IP是TCP/IP协议簇中最为重要的协议。所有的TCP,UDP, ICMP和IGMP数据都以IP数据报格式传输IP提供的是不可靠、无连接的协议


/* IP header */
struct sniff_ip
u_char ip_vhl; /* version <<4 | header length >> 2 &#xff08;8bits&#xff09;待分割*/
u_char ip_tos; /* type of service&#xff08;8bits&#xff09; */
u_short ip_len; /* total length&#xff08;16bits&#xff09; 这个是ip包长度&#xff0c;区分首部长度*/
u_short ip_id; /* identification&#xff08;16bits&#xff09; 认证 */
u_short ip_off; /* fragment offset field&#xff08;16bits&#xff09;待分割 */
/*下面三个成员项是对ip_off的借位&#xff0c;u_short共2Bytes即16bits&#xff0c;0x代表16进制位&#xff0c;且每个16进制位对应拓展成4个二进制位*/
#define IP_RF 0x8000 /* reserved fragment flag&#xff08;1bits&#xff09; 保留位 */
#define IP_DF 0x4000 /* dont fragment flag&#xff08;1bits&#xff09; 分片位 */
#define IP_MF 0x2000 /* more fragments flag&#xff08;1bits&#xff09; "是否更多"位 */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits&#xff08;13bits&#xff09; */
u_char ip_ttl; /* time to live TTL*/
u_char ip_p; /* protocol */
u_short ip_sum; /* checksum */
struct in_addr ip_src,ip_dst; /* source and dest address */
;
#define IP_HL(ip) (((ip)->ip_vhl) & 0x0f) /* Header Length (4bits)*/
#define IP_V(ip) (((ip)->ip_vhl) >> 4) /* Version (4bits)*/

TCP首部



TCP提供一种面向连接的、可靠的字节流服务。如果不计选项字段&#xff0c;它通常是20个字节。



  • 4位头部长度&#xff1a; 标识该tcp头部有多少个32bit字&#xff08;4字节&#xff09;因为4位最大能表示15&#xff0c;所以tcp头部最长是60字节。

  • 6位标志位&#xff08;即图中的保留6位&#xff09;&#xff1a;标志位有如下几项

  • URG标志&#xff0c;表示紧急指针是否有效

  • ACK标志&#xff0c;表示确认号是否有效。称携带ACK标志的tcp报文段为确认报文段

  • PSH标志&#xff0c;提示接收端应用程序应该立即从tcp接受缓冲区中读走数据&#xff0c;为接受后续数据腾出空间&#xff08;如果应用程序不将接收的数据读走&#xff0c;它们就会一直停留在tcp缓冲区中&#xff09;

  • RST标志&#xff0c;表示要求对方重新建立连接。携带RST标志的tcp报文段为复位报文段

  • SYN标志&#xff0c;表示请求建立一个连接。携带SYN标志的tcp报文段为同步报文段

  • FIN标志&#xff0c;表示通知对方本端要关闭连接了。携带FIN标志的tcp报文段为结束报文段

  • 16位窗口大小&#xff1a;是tcp流量控制的一个手段。这里说的窗口&#xff0c;指的是接收通告窗口。它告诉对方本端的tcp接收缓冲区还能容纳多少字节的数据&#xff0c;这样对方就可以控制发送数据的速度

  • 16位校验和&#xff1a;由发送端填充&#xff0c;接收端对tcp报文段执行CRC算法以校验tcp报文段在传输过程中是否损坏。注意&#xff0c;这个校验不仅包括tcp头部&#xff0c;也包括数据部分。这也是tcp可靠传输的一个重要保障。

  • 16位紧急指针&#xff1a;是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。因此&#xff0c;确切的说&#xff0c;这个字段是紧急指针相对当前序列号的偏移&#xff0c;称为紧急偏移。tcp的紧急指针是发送端向接收端发送紧急数据的方法

  • 16位选项&#xff1a;TCP头部的最后一个选项字段可变长的可选信息。这部分最多包含40字节&#xff0c;因为TCP头部最长是60字节&#xff08;其中还包含前面讨论的20字节的固定部分&#xff09;。典型的TCP头部选项结构如图所示。

/* TCP header */
typedef u_int tcp_seq;
struct sniff_tcp
u_short th_sport; /* source port (16bits)*/
u_short th_dport; /* destination port (16bits)*/
tcp_seq th_seq; /* sequence number (32bits)*/
tcp_seq th_ack; /* acknowledgement number (32bits)*/
u_char th_offx2; /* data offset, rsvd (8bits,待分割)*/
#define TH_OFF(th) (((th)->th_offx2 & 0xf0) >> 4)
u_char th_flags;
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
#define TH_ECE 0x40
#define TH_CWR 0x80
#define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)
u_short th_win; /* window */
u_short th_sum; /* checksum */
u_short th_urp; /* urgent pointer */
;

推荐阅读
  • 本文详细介绍了 Kubernetes 集群管理工具 kubectl 的基本使用方法,涵盖了一系列常用的命令及其应用场景,旨在帮助初学者快速掌握 kubectl 的基本操作。 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 本文详细介绍如何在Windows 7操作系统中安装Python,并在IIS (Internet Information Services) 中配置Python脚本的运行环境。步骤包括安装必要的组件、配置IIS处理程序映射以及测试Python脚本的执行。 ... [详细]
  • 大数据基础:JavaSE_day06 ... [详细]
  • 深入解析BookKeeper的设计与应用场景
    本文介绍了由Yahoo在2009年开发并于2011年开源的BookKeeper技术。BookKeeper是一种高效且可靠的日志流存储解决方案,广泛应用于需要高性能和强数据持久性的场景。 ... [详细]
  • Asp.net MVC 中 Bundle 配置详解:合并与压缩 JS 和 CSS 文件
    本文深入探讨了 Asp.net MVC 中如何利用 Bundle 功能来合并和压缩 JavaScript 和 CSS 文件,提供了详细的配置步骤和示例代码,适合开发人员参考学习。 ... [详细]
  • 在Java应用程序开发过程中,FTP协议被广泛用于文件的上传和下载操作。本文通过Jakarta Commons Net库中的FTPClient类,详细介绍如何实现文件的上传和下载功能。 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 深入解析Android中的SQLite数据库使用
    本文详细介绍了如何在Android应用中使用SQLite数据库进行数据存储。通过自定义类继承SQLiteOpenHelper,实现数据库的创建与版本管理,并提供了具体的学生信息管理示例代码。 ... [详细]
  • 本文探讨了如何利用 Python 的 PyPDF2 库在内存中高效地合并多个 PDF 文件,并讨论了相关的内存管理问题及优化策略。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 本文详细探讨了JavaScript中new操作符的内部机制及其在对象实例化过程中的作用,帮助开发者更好地理解和应用这一核心概念。 ... [详细]
  • 本文档详细介绍了Scrapy框架中的信号系统,包括如何利用信号来增强爬虫的功能性和灵活性,以及各个内置信号的具体用途和参数。 ... [详细]
  • 本文介绍了一个项目中如何在Windows平台上实现多声道音频数据的采集,特别是针对DANTE音频接口的8路立体声音频通道。文章详细描述了使用Windows底层音频API进行音频采集的方法,并提供了一个具体的实现示例。 ... [详细]
author-avatar
最最时尚搭配攻略_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有